#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// 长时间执行的线程
void *task(void *arg)
{
    printf("task线程开始执行\n");

    // 模拟工作
    printf("task线程工作中...\n");
    sleep(3);

    printf("task线程sleep之后执行结束\n");

    return NULL;
}

int main()
{
    printf("主线程开始\n");
    pthread_t pt;
    // 创建线程
    pthread_create(&pt, NULL, task, NULL);
    // 主线程休眠1秒 把执行的机会让给子线程
    sleep(1);
    // 取消子线程
    pthread_cancel(pt);
    // 等待子线程结束
    void *result; // 用于接收子线程的返回值
    pthread_join(pt, &result);
    // 判断子线程是否被取消
    /*子线程开始执行后，它会先打印“task线程开始执行”。
    然后，子线程执行 sleep(3) 模拟工作，实际休眠 3 秒。
    但在休眠 1 秒后，主线程调用了 pthread_cancel(pt) 来取消子线程，导致子线程在执行 sleep 时被取消。
    如果子线程在被取消时仍在休眠，线程会被取消，result 返回 PTHREAD_CANCELED，表示线程是被取消的。*/
    if (result == PTHREAD_CANCELED)
    {
        printf("子线程被取消结束\n");
    }
    else
    {
        printf("子线程正常结束\n");
    }

    printf("主线程结束\n");
    return 0;
}